
在 TypeSpec 中可使用命名空間 namespace 來分類類型,透過這樣的方式可以組織不同類型,也可以避免命名衝突,範例程式碼如下:
namespace MemberService;
// 以下開始撰寫的程式碼屬於 MemberService 這個 namespace
命名空間中可以有其他命名空間,使用 {} 或 . 來表達階層關係,例如 MemberService 中的 Member 命名空間程式碼如下:
namespace MemberService.Member;
// 以下開始撰寫的程式碼屬於 MemberService.Member
或
namespace MemberService {
namespace Member {
// 這邊撰寫的程式碼屬於 MemberService.Member
}
}
我個人習慣一個檔案內只有一個命名空間,並讓命名空間結構和檔案目錄結構對齊,這樣比較好管理。當需要使用命名空間中的類型時,可使用 using 關鍵字,若要使用的命名空間定義在其他檔案時,需使用 import 才能正確參照,範例程式碼如下:
// member/member.tsp
namespace MemberService.Member;
// main.tsp
import "@typespec/http";
import "@typespec/rest";
import "@typespec/openapi3";
import "./member/member.tsp";
using TypeSpec.Http;
using MemberService.Member;
@service({
title: "會員服務",
version: "1.0.0"
})
@server("https://api.example.com/v1", "正式環境")
@server("https://api.staging.example.com/v1", "測試環境")
namespace MemberService;
每一支 API 就是一個行為,像是:取得會員、註冊會員......等,在 TypeSpec 中可透過操作 (Operation) 在命名空間中定義這些操作的介面。
使用關鍵字 op 宣告一個操作,接著宣告它的名字、參數和回傳,例如宣告 MemberService 有一支 HealthCheck API(healthCheck),沒有傳入參數(() 內為空),回傳為空({} 內為空),範例程式碼如下:
import "@typespec/http";
import "@typespec/rest";
import "@typespec/openapi3";
using TypeSpec.Http;
@service({
title: "會員服務",
version: "1.0.0"
})
@server("https://api.example.com/v1", "正式環境")
@server("https://api.staging.example.com/v1", "測試環境")
namespace MemberService;
op healthCheck(): {};
TypeSpec.Http 提供了 HTTP 請求所需的裝飾器,包含常見的 @get、@post、@put、@patch、@delete...... 等等,以及設定路由的 @route 裝飾器。
使用 @get 裝飾器指定操作的 HTTP 方法為 GET,並使用 @route 裝飾器指定操作的路由為 _hc,範例程式碼如下:
// 以上省略
namespace MemberService;
@get()
@route("_hc")
op healthCheck(): {};
使用 @summary 裝飾器宣告 API 名稱,並用 @doc 裝飾器撰寫 API 詳細說明。在 TypeSpec 中使用三個雙引號可撰寫多行文字,範例程式碼如下:
// 以上省略
namespace MemberService;
@get()
@route("_hc")
@summary("確認服務健康狀態")
@doc("""
這個 API 用來確認服務是否正常運作。
這個 API 不需要任何參數,只要回應 200 即表示服務正常。
""")
op healthCheck(): {};
這時編譯後會看到 openapi.yaml 在 paths 節點下產生了對應的內容如下:
openapi: 3.0.0
info:
title: 會員服務
version: 1.0.0
tags: []
paths:
/_hc:
get:
operationId: healthCheck
summary: 確認服務健康狀態
description: |2-
這個 API 用來確認服務是否正常運作。
這個 API 不需要任何參數,只要回應 200 即表示服務正常。
parameters: []
responses:
'200':
description: The request has succeeded.
components: {}
servers:
- url: https://api.staging.example.com/v1
description: 測試環境
variables: {}
- url: https://api.example.com/v1
description: 正式環境
variables: {}
Redoc 預覽如下:

明天將介紹 TypeSpec 的基礎型別。